
export {}

// 类型别名type与interface的区别

// 1.相同点一：类型别名和接口都可以用来描述对象或函数
// type
type Ponit = {
  x: number;
  y: string;
};
type SetPonit = (x: string) => void;
// interface
interface Ponit2 {
  x: number;
  y: string;
};
interface SetPoint2 {
  (x: number): number;
};

let fn1: SetPonit = (x: string) => { };
let fn2: SetPoint2 = (x: number): number => { return 1 };

// 2.相同点二：类型别名和接口都支持拓展

// type通过交叉运算拓展
type Animal = {
  name: string;
};
type Dog = Animal & { age: number };// {name: string;age: number};
// interfcae通过extends继承拓展（支持多继承）
interface Animal2 {
  name: string;
};
interface Cat extends Animal2 {
  color: string;
};// {name: sting;color: string;}

// 同时type和interface也支持一起使用来进行拓展
type Perple = {
  name: string;
};

interface Person {
  age: number;
}

type P1 = Perple & Person;// {name; string;age: number};
interface P2 extends Perple {
  color: boolean;
};// {color: boolean; name: string}




// 不同点：同名接口会自动合并，而别名不会
// 基于这个特性常常在项目中用于拓展第三方模块的类型

// interface
interface User1 {
  name: string;
};
interface User1 {
  age: number;
}
// 所以最终的User1是{name: string;age: number};

// type
type User2 = {
  name: string;
};
type User2 = {
  age: number;
}// 报错 别名定义重复